package Demo08.Demo0816;
//这是关于第四课  逻辑控制  的课后练习

import java.util.Scanner;
import java.util.Random;
public class Homework {
    public static void main1(String[] args) {

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你的年龄：");
        int a = sc.nextInt();
        if (a < 18 && a >= 0) {
            System.out.println("这是一个骚年");
        } else if (19 <= a && a <= 28) {
            System.out.println("这是一位青年");
        } else if (29 <= a && a <= 55) {
            System.out.println("这是一位中年人");
        } else if (a >= 56) {
            System.out.println("这是一位老年人");
        } else {
            System.out.println("你隔这和我卡bug呢？？");
        }
    }//题目一：根据年龄来打印出当前年龄的人是少年（低于18），青年（19-28），中年（29-55），老年（56）

    public static void main2(String[] args) {

        //何为素数？  回答：只能被 1 和它自身整除
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个数字：");
        int a = sc.nextInt();
        int b = 0;
        double c = Math.sqrt(a);//这里最后是用 c  来搞的
        for (int i = 2; i <= c; i++) { //这里可以对中间的表达式2搞事 ，来一个  i * i <= a ,这就很nice。
            if (a % i == 0) {
                b++;  // 这里还可以给b换成boolean型，然后直接赋值false，就可以了
                break;
            }
        }
        if (b == 0) {
            System.out.println("这是一个素数");
        } else {
            System.out.println("这不是一个素数");
        }
    }  //题目二：判断一个数字是否是素数

    public static void main3(String[] args) {

        //PS：这是如果单独从一个方法里面来讲就肯定是双层for循环嵌套，但是如果是两个方法那就是涉及到方法的三种调用了，这里暂时先用一个方法来
        //搞，等到了后面补上来。
        for (int i = 1; i < 100; i++) {
            boolean c = true;
            for (int a = 2; a * a <= i; a++)//这里其实也可以用  Math.sqrt(i)来进行判定
            {
                if (i % a == 0) {
                    c = false;
                }
            }
            if (c) {
                System.out.println(i + "这是一个素数");
            }
        }
    }  //题目三：打印 1 ~ 100之间所有的素数

    public static void main4(String[] args) {

        for (int i = 1000; i <= 2000; i++) {
            if (i % 4 == 0 && i % 100 != 0) {
                System.out.println(i + "是一个闰年");
            }
        }
    }//题目四：输出1000 - 2000之间所有的闰年

    public static void main5(String[] args) {

        for (int a = 1; a <= 9; a++) {
            /*这里是c语言中的写法
            for (int b = 1; b <= a; b++) {
                System.out.printf("%d * %d = %d\t",a,b,a*b);
            }
            System.out.printf("\n");*/
            //这里JAVA的写法
            for (int b = 1; b <= a; b++) {
                System.out.print(a + "*" + b + "=" + a * b + "\t");
            }
            System.out.println();
        }
    }//题目五：输出乘法口诀表

    public static void main6(String[] args) {

        //做完感受：有点麻烦！！
        int a, b;
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入两个数字：");
        a = sc.nextInt();
        b = sc.nextInt();
        int c = a > b ? a : b;
        int d = 0;
        for (int i = 1; i < c; i++) {
            if (a % i == 0 && b % i == 0) {
                d = i;
            }
        }
        System.out.println("最大公约数是" + d);
    }//题目六：求两个正整数的最大公约数

    public static void main7(String[] args) {
        //题目七：求出0~999之间的水仙花数
        //PS：水仙花数指的是一位三位数每个数的立方和等于他本身，这里的话，全部来一次
        //水仙花数，叫做自幂数，但是一位数和二幂数的自幂数是没有的,所以说求 0 ~ 999 的水仙花数是很不严谨的
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int count = 0;
        int m = a;
        while (m != 0){
            m = m / 10;
            count++;
        }
        //先求幂级数
        System.out.println(count);
        System.out.println("========================");
        for(int i = 2; i <= a;i++){
            int x = i;  //这里是主要的错误原因，for循环中，i = 2刚开始只使用一次！！！！然后后面的是接着第一次循环之后的值+得
            int res = 0;
            while(x != 0){
                res =(int)(res + Math.pow((x % 10),count));
                x = x / 10;
            }
            if(res == i){
                System.out.println(i + "这是一个水仙花数");
            }
        } //这是一个错误的示范
    /*    System.out.println("请输入一个最高数：");
        Scanner sc = new Scanner(System.in);
        int i = sc.nextInt();
        for (int i1 = 2; i1 < i; i1++) {
            int x = i1 / 100;
            int y = i1 / 10 % 10;
            int z = i1 % 10;
            int res = x * x * x + y * y * y + z * z * z;
            if (i1 == res) {
                System.out.println(i1 + "是一个素数");
            }
        }*/

    }// 题目七 ：求水仙花数

    public static void main8(String[]  args) {

        System.out.println("请输入一个数字：");
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int c = 0;
        while (a > 0) {
            if((a & 1) == 1){/*         这里问题是  我用异或，为什么不行！！ (1) a % 2 == 1 (2)(a & 1) == 1
                                        (3)(a | 0) == 1(不行)（按位或）   (4) (a ^ 0) == 1  (不行)（按位异或） */
                c ++;
            }
            a = a >> 1;  //  a = a / 2;
        }
        System.out.println("二进制中此数字1的个数为：" + c);

} //题目八： 写一个函数返回参数二进制中1的个数

    public static void main9(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个数字：");
        int a = sc.nextInt();
        int b = a;
        int count = 1;//来一个计数器，记录当前奇数位还是偶数位置
        System.out.println("偶数位输出：");
        while(a > 0){
            if(count % 2 == 0){//这里判断当然是奇数位还是偶数位
                if((a & 1) == 1){ //这里判断数字 0  1  并且输出
                    System.out.print("1");
                }else{
                    System.out.print("0");
                }
            }
            count++; //这里++，进入下一位的移位
            a = a >> 1;
        }
        System.out.println();
        count = 1;
        System.out.println("奇数位输出：");
        while(b > 0){ //因为a已经被上面的使用过了，所以这里使用B
            if(count % 2 != 0){ //这里判断是否是奇数位
                if((b & 1) == 1){ //判断输出是0还是1
                    System.out.print("1");
                }else{
                    System.out.print("0");
                }
            }
            count++;
            b = b >> 1;
        }  //这里的话，我打印出来是逆序打印，所以现在用正序打印一次
          //这个是我自己写的，打印的是逆序
       /* Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();

        //先搞偶数列
        for (int i = 31; i >= 1; i -= 2) {
            System.out.print(((a >> i) & 1) + " ");
        }

        System.out.println();

        //再搞奇数列
        for (int i = 30; i >= 0; i -= 2) {
            System.out.print(((a >> i) & 1) + " ");
        }  */  //这个是正序打印，但是前面有0
    }  // //第九题：获取一个数二进制数列中所有的偶数位和奇数位，分别输出二进制序列(正序咋搞) 我这里是逆序输出！！

    public static void main10(String[] args) {

        //这里需要用到Random函数，所以看一下
        Random ran = new Random();
        Scanner sc = new Scanner(System.in);
        int a = ran.nextInt(100);//在 0 ~ 100随机取一个数字
        while(true){
            System.out.println("请随机输入一个在0~100间的数字：");
            int b = sc.nextInt();
            if(a > b){
                System.out.println("你猜的太小了");
            }else if (a < b){
                System.out.println("你猜的太大了");
            }else{
                System.out.println("恭喜你，猜对了");
                System.out.println("游戏结束！！");
                break;
            }
        }
    }   //完成猜数字游戏

    public static void main11(String[] args) {

      /*
        int[][] t = new int[5][5];
        for (int a = 0; a< 5; a++) {
            for (int b = 0; b < 5; b++) {
                if(a == b){
                    t[a][b] = '*';
                }
                if(b == 5 - a - 1){//这块咋搞来着，思路在这里有点卡，
                    t[a][b] = ' ';
                }
            }
            for (int c = 0; c< 5; c++) {
                for (int d = 0; d < 5; d++) {
                    System.out.print(t[c][d] + ' ');
                    }
                System.out.println();
                }
        }*/  //这里用二维数组第一次尝试，但是发现相关知识不太懂，所以不用数组
        for (int a = 0; a< 5; a++) {
            for (int b = 0; b < 5; b++) {
                if(a == b  || b == 5 - a - 1){
                    System.out.print("*");
                }else {
                    System.out.print(" ");
                }
                }
            System.out.println();
            }
        }//额外题目： 打印一个X

    public static void main12(String[] args) {
        int count = 0;//计数器
        for (int i = 0; i < 100; i++) {
            if((i / 10 == 9)  || (i % 10 == 9)){
                System.out.println(i);
                count++;
            }
        }
        System.out.println("出现数字9总共" + count + "次");
    }//编写程序数一下 1到 100 的所有整数中出现多少个数字9

    public static void main13(String[] args) {
        //计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值 。
        double res = 0; //用来记录总和
        for (double i = 1.0; i < 100.0; i++) { //这里的话如果想用int  i = 1,那么直接给下面的分子1改为1.0也行
            res += (1 / i);
        }
        System.out.println(res);
    }//计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值 。

    public static void main14(String[] args) {
        //编写代码模拟三次密码输入的场景。 最多能输入三次密码，密码正确，提示“登录成功”,
        // 密码错误， 可以重新输 入，最多输入三次。三次均错，则提示退出程序
        int key = 123;
        int count = 1; //记录输入次数
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入密码：");
        while(sc.hasNext()){
            if(count <= 2){
            if(key == sc.nextInt()){
                System.out.println("输入成功");
            }else{
                System.out.println("输入错误，请再次输入：");
            }
            }else if(count == 3){
                if(key == sc.nextInt()){
                    System.out.println("输入成功");
                }else{
                    System.out.println("错了，回家中地去吧");
                    break;
                }
            }
            count++;
        }
        }// 提示“登录成功”,密码错误， 可以重新输 入，最多输入三次。三次均错，则提示退出程序

    }




